Importación de Librerías

# Load libraries
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Load sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error

import warnings
warnings.filterwarnings("ignore")

A continuación usamos la función read_cvs() de la libreria pandaspara cargar los datos a nuestro entorno de trabajo.

df = pd.read_csv("data_2017_2022.csv", sep=";")
df_1 = df.copy()
df_1["medicion"]=df_1["medicion"].str.replace(",", ".").astype("float") # convertir variable medición a númerica
df_1['fecha'] = pd.to_datetime(df_1['fecha']) # convertir variable fecha a datatime
df_1 = df_1.pivot(index=["fecha", "estacion"],columns= "variable", values="medicion").reset_index()

Para más practicidad se renombran las variables de nuestro conjunto de datos.

df_1 = df_1.rename(columns={    
    'variable': 'var',
    'black_carbon': 'BC',
    'direccion_viento': 'WD',
    'humedad': 'HR',
    'lluvia': 'RF',
    'presion': 'P',
    'radiacion_solar': 'RS',
    'temperatura': 'AT',
    'temperatura_10_m': 'AT_10_m',
    'uv-pm': 'UV',
    'velocidad_viento': 'WS',
    'h2s': 'H2S',
    'no2': 'NO2',
    'o3': 'O3',
    'so2': 'SO2',
    'pm10': 'PM10',
    'pm25': 'PM2.5'  
})

Dado que la variable la variable \(\text{NO}_2\) tiene solo \(1\) medición entre \(473.256\) registros durante el periodo analizado, lo que representa casi un \(100\%\) de datos faltantes, hemos optado por excluirla del análisis.

df_t = df_1.copy()
df_t = df_t.drop(columns=["NO2"])
df_compartir = df_t[df_t['estacion'] == 'compartir']
df_base_aerea = df_t[df_t['estacion'] == 'base_aerea']
df_canaveralejo = df_t[df_t['estacion'] == 'canaveralejo']
df_era_obrero = df_t[df_t['estacion'] == 'era_obrero']
df_ermita = df_t[df_t['estacion'] == 'ermita']
df_flora = df_t[df_t['estacion'] == 'flora']
df_pance = df_t[df_t['estacion'] == 'pance']
df_transitoria = df_t[df_t['estacion'] == 'transitoria']
df_univalle = df_t[df_t['estacion'] == 'univalle']

Radiación Solar (RS) #

import plotly.graph_objects as go
import pandas as pd

fig = go.Figure()

# Añadir la traza de la línea
fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['RS'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Radiación Solar',
    opacity=0.7
))

# Ajustar el diseño del gráfico
fig.update_layout(
    title='Radiación Solar (W/m2) a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Radiación Solar (W/m2)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'), 
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco para mejorar la visualización
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="RS", marginal="box", nbins=50, title="Densidad de Radiación Solar (W/m2)  Estación Compartir",
                           labels={'RS': 'Radiación Solar (W/m2)'}, color_discrete_sequence=['#30143F'],
    opacity=0.7)


fig_density.update_layout(
    xaxis_title="Radiación Solar (W/m2)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear la columna 'Año' basada en 'fecha'
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']  

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar (W/m2) por Año",
    xaxis_title="Año",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar Mensual",
    xaxis_title="Mes",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  # Asegurar que todos los días se muestran en el orden correcto
        ticktext=orden_dias,  # Etiquetas para cada día en el orden correcto
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']

# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['RF'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Radiación Solar por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Radiación Solar (W/m2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En los gráficos analizados, se observa que los niveles más altos de radiación solar (medidos en \(m/s^2\)) se registraron en 2017, mientras que los niveles más bajos ocurrieron en 2020. Este patrón puede estar influenciado por variaciones climáticas o eventos atmosféricos específicos de esos años.

En cuanto a la distribución mensual, los meses de marzo, abril, mayo, septiembre, noviembre y diciembre presentan los niveles más altos de radiación solar. Esto podría estar relacionado con la posición del sol y la duración del día durante estos meses, que suelen coincidir con las estaciones de primavera y otoño en muchas regiones, donde la radiación solar es más intensa.

Al examinar las horas del día, se detecta una disminución en los niveles de radiación solar entre las 9 a.m. y el mediodía. Este fenómeno puede deberse a varios factores, como la presencia de nubes matutinas que se disipan más tarde en el día, o la inclinación del sol que afecta la intensidad de la radiación recibida en la superficie. Además, de la actividad humana, como la contaminación del aire, puede impactar la transmisión de la radiación solar.

Dirección del Viento (WD) #

import plotly.graph_objects as go
import pandas as pd


fig = go.Figure()


fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['WD'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Dirección del viento (°)',
    opacity=0.7
))


fig.update_layout(
    title='Dirección del viento a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Dirección del viento (°)',
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  # Rotar etiquetas del eje X y formato de fecha
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco para mejorar la visualización
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="WD", marginal="box", nbins=50, title="Densidad de Dirección del viento (°) Estación Compartir",
                           labels={'WD': 'Dirección del viento (°)'}, color_discrete_sequence=['#30143F'],opacity=0.7)


fig_density.update_layout(
    xaxis_title="Dirección del viento (°)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 


figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento (°) por Año",
    xaxis_title="Año",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento Mensual",
    xaxis_title="Mes",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  # Etiquetas para cada mes en el orden correcto
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)


figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias, 
        ticktext=orden_dias,  
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['WD'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Dirección del viento por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Dirección del viento (°)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)

# Mostrar el gráfico interactivo
figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la dirección del viento (°) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 3 p.m. y 6 p.m., la mediana de dirección del viento muestra un cambio en la dirección leve comparado con otras horas, con una mayor dispersión en los datos en toda la franja horaria.

A continuación, realizaremos un análisis exhaustivo del comportamiento de la Dirección del viento en relación con su origen geográfico, tomando como punto de referencia la ubicación de la ciudad de Cali. Para facilitar este análisis, hemos establecido una serie de intervalos precisos que corresponden a las principales direcciones cardinales e intermedias. Estos intervalos se definen de la siguiente manera:

  • Norte (N): 337.5° - 22.5°

  • Nororiente (NE): 22.5° - 67.5°

  • Oriente (E): 67.5° - 112.5°

  • Suroriente (SE): 112.5° - 157.5°

  • Sur (S): 157.5° - 202.5°

  • Suroccidente (SO): 202.5° - 247.5°

  • Occidente (O): 247.5° - 292.5°

  • Noroccidente (NO): 292.5° - 337.5°

La implementación de estos intervalos nos permitirá:

  • Clasificar con precisión las direcciones del viento registradas en nuestros datos.

  • Comprender en profundidad los patrones de rotación del viento a lo largo del tiempo.

  • Interpretar de manera más intuitiva las tendencias y variaciones en la dirección del viento.

  • Relacionar la dirección del viento con otros factores meteorológicos y geográficos relevantes para Cali.

import pandas as pd
import numpy as np

# Ajustar los intervalos de dirección del viento
bins_wd = [-0.001, 22.5, 67.5, 112.5, 157.5, 202.5, 247.5, 292.5, 337.5, 360.001]
labels_wd = ['Norte (N)', 'Nororiente (NE)', 'Oriente (E)', 'Suroriente (SE)', 
             'Sur (S)', 'Suroccidente (SO)', 'Occidente (O)', 'Noroccidente (NO)', 'Norte (N)']

# 'WD' es una columna numérica con las direcciones del viento en grados
df_compartir['WD'] = pd.to_numeric(df_compartir['WD'], errors='coerce')

# Crear la nueva columna 'WD_GEO' con las categorías basadas en los intervalos
df_compartir['WD_GEO'] = pd.cut(df_compartir['WD'], bins=bins_wd, labels=labels_wd, right=False, include_lowest=True, ordered=False)

# Definir las categorías en el orden correcto y convertir 'WD_GEO' a tipo categórico ordenado
orden_categorias = ['Norte (N)', 'Nororiente (NE)', 'Oriente (E)', 'Suroriente (SE)', 
                    'Sur (S)', 'Suroccidente (SO)', 'Occidente (O)', 'Noroccidente (NO)']

df_compartir['WD_GEO'] = pd.Categorical(df_compartir['WD_GEO'], categories=orden_categorias, ordered=True)
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="WD_GEO", nbins=50, title="Distribución de Dirección del viento (°) Estación Compartir",
                           labels={'WD_GEO': 'Dirección del viento (°)'}, color_discrete_sequence=['#30143F'],opacity=0.7)


fig_density.update_layout(
    xaxis_title="Dirección del viento (°)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go


# Crear una columna adicional para el año basado en la fecha
df_compartir['Año'] = df_compartir['fecha'].dt.year

# Contar el número de ocurrencias de cada categoría de intensidad por año
df_count = df_compartir.groupby(['Año', 'WD_GEO']).size().reset_index(name='Conteo')


# Crear una figura usando plotly.graph_objects
figbar = go.Figure()

# Definir colores para las categorías de dirección del viento
colores_wd = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']

# Añadir trazas manualmente para cada categoría de dirección del viento
for i, label in enumerate(labels_wd):
    figbar.add_trace(go.Bar(
        x=df_count[df_count['WD_GEO'] == label]['Año'],
        y=df_count[df_count['WD_GEO'] == label]['Conteo'],
        name=label,
        marker_color=colores_wd[i % len(colores_wd)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbar.update_layout(
    title="Distribución de la Dirección del Viento por Año",
    xaxis_title="Año",
    yaxis_title="Número de Observaciones",
    barmode='group',  # Mostrar barras al lado una de la otra
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='linear'  # Asegurar que los ticks en el eje x son lineales para mejor visualización
    )
)


figbar.show()
import pandas as pd
import plotly.graph_objects as go

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', 
                 '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear columnas adicionales para el mes y el número del mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)
df_compartir['Mes_Num'] = df_compartir['fecha'].dt.month

# Contar el número de ocurrencias de cada categoría de dirección del viento por mes
df_count = df_compartir.groupby(['Mes', 'WD_GEO']).size().reset_index(name='Conteo')

# Asegurarse de que los meses estén en el orden correcto
df_count['Mes'] = pd.Categorical(df_count['Mes'], categories=orden_meses, ordered=True)
df_count = df_count.sort_values('Mes')


figbox = go.Figure()

# Añadir trazas para cada categoría de dirección del viento
for i, label in enumerate(df_count['WD_GEO'].unique()):
    df_subset = df_count[df_count['WD_GEO'] == label]
    figbox.add_trace(go.Bar(
        x=df_subset['Mes'],
        y=df_subset['Conteo'],
        name=label,
        marker_color=colores_meses[i % len(colores_meses)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de la Dirección del Viento Mensual",
    xaxis_title="Mes",
    yaxis_title="Número de Observaciones",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  
        ticktext=orden_meses,  
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    ),
    template='plotly_white'  # Fondo blanco para mejorar la visualización
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']


# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Agrupar por día de la semana y categoría de dirección del viento y contar ocurrencias
df_semanal = df_compartir.groupby(['Día', 'WD_GEO']).size().reset_index(name='Conteo')

# Asegurarse de que los días de la semana estén en el orden correcto
df_semanal['Día'] = pd.Categorical(df_semanal['Día'], categories=orden_dias, ordered=True)
df_semanal = df_semanal.sort_values('Día')

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir la traza de barras para cada categoría de dirección del viento
for i, categoria in enumerate(df_semanal['WD_GEO'].unique()):
    df_categoria = df_semanal[df_semanal['WD_GEO'] == categoria]
    figbox.add_trace(go.Bar(
        x=df_categoria['Día'],
        y=df_categoria['Conteo'],
        name=categoria,
        marker_color=colores_dias[i % len(colores_dias)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de la Dirección del Viento por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Número de Observaciones",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,
        ticktext=orden_dias, 
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    ),
    barmode='group',  # Mostrar barras al lado una de la otra
    template='plotly_white'  # Fondo blanco
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f'{i:02d}:00' for i in range(24)]

# Crear un diccionario para mapear horas a números
hora_a_numero = {hora: i for i, hora in enumerate(orden_horas)}

# Definir una lista de colores para las horas del día (si se requieren más colores, ajusta la lista)
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f',
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902',
                 '#e69c24', '#d98e31', '#c67e3f', '#a86e4f', '#8f615c', '#734764', '#5a3b59',
                 '#432c4d', '#30143F']

# Crear una columna adicional para la hora del día basado en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f'{x:02d}:00')

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(hora_a_numero)

# Agrupar por hora del día y categoría de dirección del viento y contar ocurrencias
df_horario = df_compartir.groupby(['Hora', 'WD_GEO']).size().reset_index(name='Conteo')

# Asegurarse de que las horas estén en el orden correcto
df_horario['Hora'] = pd.Categorical(df_horario['Hora'], categories=orden_horas, ordered=True)
df_horario = df_horario.sort_values('Hora')

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir la traza de barras para cada categoría de dirección del viento
for i, categoria in enumerate(df_horario['WD_GEO'].unique()):
    df_categoria = df_horario[df_horario['WD_GEO'] == categoria]
    figbox.add_trace(go.Bar(
        x=df_categoria['Hora'],
        y=df_categoria['Conteo'],
        name=categoria,
        marker_color=colores_horas[i % len(colores_horas)]  # Asignar un color específico a cada categoría
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de la Dirección del Viento por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Número de Observaciones",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas del día
    ),
    barmode='group',  # Mostrar barras al lado una de la otra
    template='plotly_white'  # Fondo blanco para mejorar la visualización
)

# Mostrar el gráfico interactivo
figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la dirección del viento (en grados) cuando se segmentan los datos por año, mes y día de la semana. Sin embargo, al examinar los datos por horas del día, se identifica que la dirección predominante del viento proviene con mayor frecuencia del occidente, suroccidente, oriente y norte de Cali.

Velocidad del Viento (WS) #

import plotly.graph_objects as go
import pandas as pd

fig = go.Figure()

# Añadir la traza de la línea
fig.add_trace(go.Scatter(
    x=df_compartir['fecha'],
    y=df_compartir['WS'],
    mode='lines',  # Mostrar la línea
    line=dict(color='#30143F'),  # Cambiar el color de la línea
    name='Velocidad del viento (m/s2)',
    opacity=0.7
))


fig.update_layout(
    title='Velocidad del viento del viento a lo Largo del Tiempo',
    xaxis_title='Fecha',
    yaxis_title='Velocidad del viento (m/s2)',  
    xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),  # Rotar etiquetas del eje X y formato de fecha
    yaxis=dict(tickformat='.1f'),  # Formato de los ticks del eje Y (un decimal)
    template='plotly_white',  # Fondo blanco para mejorar la visualización
    title_x=0.5,  # Centrar el título
    title_font=dict(size=16)  # Ajustar el tamaño de la fuente del título
)


fig.show()
import plotly.express as px
import plotly.graph_objects as go


fig_density = px.histogram(df_compartir, x="WS", marginal="box", nbins=50, title="Densidad de Velocidad del viento (m/s2)Estación Compartir",
                           labels={'WS': 'Velocidad del viento (m/s2)'}, color_discrete_sequence=['#30143F'],opacity=0.7)

# Ajustar el diseño del gráfico de densidad
fig_density.update_layout(
    xaxis_title="Velocidad del viento (m/s2)",
    yaxis_title="Frecuencia",
    showlegend=False
)


fig_density.show()
import plotly.graph_objects as go
import pandas as pd

# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())

# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', 
                '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902'] 

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
    df_subset = df_compartir[df_compartir['Año'] == año]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=str(año),
        marker_color=colores_años[i % len(colores_años)]  # Asignar un color específico a cada año
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento por Año",
    xaxis_title="Año",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        title="Año",
        tickmode='array',
        tickvals=años,  # Asegurar que todos los años se muestran
        ticktext=[str(año) for año in años]  # Etiquetas para cada año
    )
)

# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
               "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]

# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}

# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}

# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']


# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)

# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)


figbox = go.Figure()

# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
    df_subset = df_compartir[df_compartir['Mes'] == mes]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=mes,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento Mensual",
    xaxis_title="Mes",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_meses,  # Asegurar que todos los meses se muestran en el orden correcto
        ticktext=orden_meses,  # Etiquetas para cada mes en el orden correcto
        categoryorder='array',  # Ordenar los meses en el orden especificado
        categoryarray=orden_meses  # Especificar el orden de los meses
    )
)


figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]

# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}

# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}

# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']

# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
    'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
    'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])

# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
    df_subset = df_compartir[df_compartir['Día'] == dia]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=dia,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento por Día de la Semana",
    xaxis_title="Día de la Semana",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_dias,  # Asegurar que todos los días se muestran en el orden correcto
        ticktext=orden_dias,  # Etiquetas para cada día en el orden correcto
        categoryorder='array',  # Ordenar los días en el orden especificado
        categoryarray=orden_dias  # Especificar el orden de los días de la semana
    )
)

figbox.show()
import plotly.graph_objects as go
import pandas as pd

# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]

# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}

# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', 
                 '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433', 
                 '#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c', 
                 '#356d6f', '#1e616c', '#115f6a', '#006f6f']


# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")

# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)

# Crear una figura usando plotly.graph_objects
figbox = go.Figure()

# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
    df_subset = df_compartir[df_compartir['Hora'] == hora]
    figbox.add_trace(go.Box(
        y=df_subset['WS'],
        name=hora,
        marker_color=color
    ))

# Actualizar el diseño del gráfico
figbox.update_layout(
    title="Distribución de Velocidad del viento por Hora del Día",
    xaxis_title="Hora del Día",
    yaxis_title="Velocidad del viento (m/s2)",
    title_x=0.5,  # Centrar el título
    xaxis=dict(
        tickmode='array',
        tickvals=orden_horas,  # Asegurar que todas las horas se muestran en el orden correcto
        ticktext=orden_horas,  # Etiquetas para cada hora en el orden correcto
        categoryorder='array',  # Ordenar las horas en el orden especificado
        categoryarray=orden_horas  # Especificar el orden de las horas
    )
)


figbox.show()

En relación con los gráficos analizados, se observa una tendencia consistente en la velocidad del viento (\(m/s^2\)) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 12 m. y 4 p.m., la mediana de velocidad del viento muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 4 p.m y 5 p.m. A partir de las 6 p.m., la velocidad del viento muestra una leve disminución hasta las 10 p.m., posterior a ésta hora la velocidad del viento se mantiene relativamente constantes hasta aproximadamente las 7 a.m. y un ligero incremento hasta las 11 a.m. del siguiente día.

Influencia de Carácteristicas sobre los niveles de concentración de PM10 estación Compartir #

A continuación, se llevará a cabo un análisis para validar la influencia de las características y determinar cuáles de ellas tienen un impacto significativo en los niveles de concentración de PM10, utilizando los datos de la Estación Compartir.

Influencia de dirección y velocidad del viento sobre la concentración de PM10 #

A continuación, se muestra cómo la dirección y la velocidad del viento pueden influir en las concentraciones de PM10.

import pandas as pd
import plotly.graph_objs as go

# Crear el gráfico de dispersión 3D en Plotly
fig = go.Figure(data=[go.Scatter3d(
    x=df_compartir['WD'],
    y=df_compartir['WS'],
    z=df_compartir['PM10'],
    mode='markers',
    marker=dict(
        size=5,
        color=df_compartir['PM10'],  # Colores según los valores de PM10
        colorscale='Viridis',  # Mismo colormap que en matplotlib
        opacity=0.8
    )
)])

# Actualizar el layout del gráfico para etiquetas y título
fig.update_layout(
    scene=dict(
        xaxis_title='Dirección del Viento',
        yaxis_title='Velocidad del Viento',
        zaxis_title='Concentración de PM10'
    ),
    title='Influencia de la Dirección y Velocidad del Viento sobre PM10',
    width=800,
    height=600
)

# Mostrar el gráfico
fig.show()

Se observa que la dirección del viento no tiene un impacto significativo en los niveles de concentración de PM10. Sin embargo, se aprecia un ligero patrón en la velocidad del viento: a velocidades más bajas, los datos tienden a concentrarse más, y la relación entre la velocidad del viento y la concentración de PM10 muestra un sesgo hacia la derecha.

Influencia de la velocidad del viento y la precipitación en las concentraciones de PM10 #

A continuación, se muestra cómo la velocidad del viento y la intensidad de la lluvia pueden influir en las concentraciones de PM10.

import pandas as pd
import plotly.graph_objs as go

# Crear el gráfico de dispersión 3D en Plotly
fig = go.Figure(data=[go.Scatter3d(
    x=df_compartir['WS'],
    y=df_compartir['RF'],
    z=df_compartir['PM10'],
    mode='markers',
    marker=dict(
        size=5,
        color=df_compartir['PM10'],  # Colores según los valores de PM10
        colorscale='Viridis',  # Mismo colormap que en matplotlib
        opacity=0.8
    )
)])

# Actualizar el layout del gráfico para etiquetas y título
fig.update_layout(
    scene=dict(
        xaxis_title='Velocidad del Viento',
        yaxis_title='Precipitación en mm',
        zaxis_title='Concentración de PM10'
    ),
    title='Influencia de Velocidad del Viento y Precipitación sobre PM10',
    width=800,
    height=600
)

# Mostrar el gráfico
fig.show()

Se observa un patrón leve en la relación entre la velocidad del viento, la precipitación y la concentración de PM10. A velocidades de viento más bajas y con lluvias ligeras las concentraciones de PM10 tienen a aumentar, mientras que con mayores precipitaciones y velocidades de viento, la concentración de PM10 tiende a dispersarse y disminuir, evidenciando un sesgo hacia la derecha.

Influencia de la Presión y Temperatura Ambiente en las concentraciones de PM10 #

A continuación, se muestra cómo la humedad relativa y la temperatura pueden influir en las concentraciones de PM10.

import pandas as pd
import plotly.graph_objs as go

# Crear el gráfico de dispersión 3D en Plotly
fig = go.Figure(data=[go.Scatter3d(
    x=df_compartir['P'],
    y=df_compartir['AT'],
    z=df_compartir['PM10'],
    mode='markers',
    marker=dict(
        size=5,
        color=df_compartir['PM10'],  # Colores según los valores de PM10
        colorscale='Viridis',  # Mismo colormap que en matplotlib
        opacity=0.8
    )
)])

# Actualizar el layout del gráfico para etiquetas y título
fig.update_layout(
    scene=dict(
        xaxis_title='Presión',
        yaxis_title='Temperatura Ambiente',
        zaxis_title='Concentración de PM10'
    ),
    title='Influencia de Presión y Temperatura Ambiente sobre PM10',
    width=800,
    height=600
)

# Mostrar el gráfico
fig.show()

Dado el comportamiento inusual en los registros de presión, con valores que oscilan entre 900 hPa y 680 hPa, lo cual podría estar relacionado con la presencia de tormentas tropicales, se procederá a realizar un análisis más exhaustivo de la presión atmosférica. El objetivo es validar si alguna condición ambiental específica pudo haber causado esta anomalía.

Nota: La variación mencionada es bastante extrema para una situación normal, por lo que sería importante confirmar la precisión de los datos o considerar otras posibles causas antes de concluir una relación directa con tormentas tropicales.

import pandas as pd
import plotly.graph_objs as go

# Crear el gráfico de dispersión 3D en Plotly
fig = go.Figure(data=[go.Scatter3d(
    x=df_compartir['RF'],
    y=df_compartir['AT'],
    z=df_compartir['P'],
    mode='markers',
    marker=dict(
        size=5,
        color=df_compartir['PM10'],  # Colores según los valores de PM10
        colorscale='Viridis',  # Mismo colormap que en matplotlib
        opacity=0.8
    )
)])

# Actualizar el layout del gráfico para etiquetas y título
fig.update_layout(
    scene=dict(
        xaxis_title='Lluvia',
        yaxis_title='Temperatura Ambiente',
        zaxis_title='Presion'
    ),
    title='Influencia de Presión y Temperatura Ambiente sobre la intensidad de Lluvia',
    width=800,
    height=600
)

# Mostrar el gráfico
fig.show()

Se observa que la intensidad de las precipitaciones no tiene un impacto significativo en la presión atmosférica. Sin embargo, se identifica un ligero patrón en la temperatura ambiente: a medida que aumenta la intensidad de la lluvia, la temperatura tiende a disminuir. No se detecta un patrón claro en relación con la presión atmosférica, lo que sugiere que la discrepancia en las mediciones podría deberse a errores de medición. Es posible que el barómetro utilizado para registrar las mediciones estuviera desajustado durante el período comprendido entre 2017 y octubre de 2019, dado que las presiones registradas no son normales y claramente no fueron producto de tormentas tropicales o cambios atmosféricos drasticos.

Influencia de la Precipitación y Humedad Relativa en las concentraciones de PM10 #

import pandas as pd
import plotly.graph_objs as go

# Crear el gráfico de dispersión 3D en Plotly
fig = go.Figure(data=[go.Scatter3d(
    x=df_compartir['RF'],
    y=df_compartir['HR'],
    z=df_compartir['PM10'],
    mode='markers',
    marker=dict(
        size=5,
        color=df_compartir['PM10'],  # Colores según los valores de PM10
        colorscale='Viridis',  # Mismo colormap que en matplotlib
        opacity=0.8
    )
)])

# Actualizar el layout del gráfico para etiquetas y título
fig.update_layout(
    scene=dict(
        xaxis_title='Precipitación en mm',
        yaxis_title='Humedad Relativa',
        zaxis_title='Concentración de PM10'
    ),
    title='Influencia de Humedad Relativa y Precipitación sobre PM10',
    width=800,
    height=600
)

# Mostrar el gráfico
fig.show()

Se observa que la humedad relativa no tiene un impacto significativo en la concentración de PM10. Sin embargo, cuando se producen lluvias intensas, las concentraciones de PM10 tienden a disminuir.

Influencia de la Radiación Solar y Ozono en las concentraciones de PM10 #

import pandas as pd
import plotly.graph_objs as go

# Crear el gráfico de dispersión 3D en Plotly
fig = go.Figure(data=[go.Scatter3d(
    x=df_compartir['RS'],
    y=df_compartir['O3'],
    z=df_compartir['PM10'],
    mode='markers',
    marker=dict(
        size=5,
        color=df_compartir['PM10'],  # Colores según los valores de PM10
        colorscale='Viridis',  # Mismo colormap que en matplotlib
        opacity=0.8
    )
)])

# Actualizar el layout del gráfico para etiquetas y título
fig.update_layout(
    scene=dict(
        xaxis_title='Radiación Solar',
        yaxis_title='Concentración de Ozono',
        zaxis_title='Concentración de PM10'
    ),
    title='Influencia de Humedad Relativa y Concentración de Ozono sobre PM10',
    width=800,
    height=600
)

# Mostrar el gráfico
fig.show()

Se observa un patrón en la relación entre la concentración de ozono, la radiación solar y la concentración de PM10. A medida que aumenta la radiación solar, tiende a incrementarse la concentración de ozono, mientras que la concentración de PM10 suele disminuir. Esto se debe a que la radiación solar favorece las reacciones fotoquímicas que producen ozono, mientras que también puede contribuir a la dispersión de partículas PM10. Por otro lado, cuando los niveles de radiación solar disminuyen, se observa una reducción en la concentración de ozono y un posible aumento en la concentración de PM10.